﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;

namespace Client
{
    // 레지스트리 관리와 관련된 클래스

    public class RegistryAdmin
    {
        // Application Registry Key
        private static RegistryKey rkApp;
        // Option Registry Key
        private static RegistryKey rkOption;

        // Registry Key 를 읽어옴.
        public static void Init()
        {
            rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
            rkOption = Registry.CurrentUser.OpenSubKey("SOFTWARE\\HanSubversion", true);
            if (rkOption == null)
            {
                rkOption = Registry.CurrentUser.OpenSubKey("SOFTWARE", true);
                rkOption.CreateSubKey("HanSubversion");
                rkOption = Registry.CurrentUser.OpenSubKey("SOFTWARE\\HanSubversion", true);
            }
        }

        // Auto Start Registry Key 등록
        // 자동 실행이 가능해짐.
        public static void AutoStartReg()
        {
            if (rkApp == null)
            {
                rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
            }

            rkApp.SetValue("HanSubvesion", System.Windows.Forms.Application.ExecutablePath.ToString());
        }

        // Auto Start Registry Key 해제
        // 자동 실행이 불가능해짐.
        public static void AutoStartDel()
        {
            if (rkApp == null)
            {
                rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
            }

            rkApp.DeleteValue("HanSubvesion", false);
        }

        // 레지스트리 키 타입
        public enum KEY_NAME
        {               // Type     | Text
            AUTOSTART,  // bool     | 자동실행여부
            SAVE_ID,    // bool     | 자동로그인여부
            ID,         // string   | 자동로그인 아이디
            PASSWORD    // password | 자동로그인 패스워드
        }

        // 레지스트리 키값을 설정
        public static void SetRegistryKey(KEY_NAME keyName, object value)
        {
            switch (keyName)
            {
                case KEY_NAME.SAVE_ID :
                    rkOption.SetValue("SaveID", true);
                    SavedUserData data = (SavedUserData)value;
                    rkOption.OpenSubKey("UserInfo");
                    if (rkOption == null)
                    {
                        Registry.CurrentUser.CreateSubKey("SOFTWARE\\SubVersion\\UserInfo");
                        rkOption.CreateSubKey("\\UserInfo");
                        rkOption.OpenSubKey("UserInfo");
                    }
                    rkOption.SetValue("ID", data.ID);
                    rkOption.SetValue("PassWord", data.password);
                    rkOption = Registry.CurrentUser.OpenSubKey("SOFTWARE\\HanSubversion");
                    break;
            }
        }

        // 레지스트리 키를 삭제
        public static void DelRegistryKey(KEY_NAME keyName)
        {
            switch (keyName)
            {
                case KEY_NAME.SAVE_ID :
                    rkOption.SetValue("SaveID", false);
                    break;
            }
        }

        // 레지스트리 키값을 반환
        public static object GetRegistryKey(KEY_NAME keyName)
        {
            switch (keyName)
            {
                case KEY_NAME.SAVE_ID:
                    {
                        object ret = rkOption.GetValue("SaveID");
                        if (ret == null || (string)ret == "False")
                        {
                            ret = false;
                        }
                        else
                        {
                            ret = true;
                        }
                        return ret;
                    }
                case KEY_NAME.ID:
                    {
                        string ret = (string)rkOption.GetValue("ID");
                        return ret;
                    }
                case KEY_NAME.PASSWORD:
                    {
                        string ret = (string)rkOption.GetValue("PassWord");
                        return ret;
                    }
                case KEY_NAME.AUTOSTART:
                    {
                        object ret = rkApp.GetValue("HanSubversion");
                        if (ret == null || (string)ret == "False")
                        {
                            ret = false;
                        }
                        else
                        {
                            ret = true;
                        }
                        return ret;
                    }
            }
            return null;
        }
    }
}
